package org.Yiran.timetale_re.item.tool.screwdriver.modules.items.function;

import net.minecraft.core.BlockPos;
import net.minecraft.core.Direction;
import net.minecraft.network.chat.Component;
import net.minecraft.world.InteractionResult;
import net.minecraft.world.item.ItemStack;
import net.minecraft.world.item.context.UseOnContext;
import net.minecraft.world.level.Level;
import net.minecraft.world.level.block.state.BlockState;
import org.Yiran.timetale_re.item.tool.screwdriver.core.ScrewdriverModuleItem;
import org.Yiran.timetale_re.item.tool.screwdriver.modules.enmu.ModuleCategory;
import org.Yiran.timetale_re.item.tool.screwdriver.modules.enmu.ModuleType;
import org.Yiran.timetale_re.item.tool.screwdriver.modules.type.RedstoneModule;
import org.jetbrains.annotations.NotNull;

/**
 * 中级红石模块物品类
 * <p>
 * 该类实现了中级红石模块，当安装到时英起子上时，
 * 可以提供红石信号激活功能。
 * </p>
 */
public class RedstoneModuleItem extends ScrewdriverModuleItem implements RedstoneModule {
    
    // ==============================
    // 构造方法
    // ==============================

    /**
     * 中级红石模块物品构造函数
     * <p>
     * 创建一个中级红石模块物品实例。
     * </p>
     */
    public RedstoneModuleItem() {
        super(
                ModuleLevel.ADVANCED,
                "tiername.level.professional"
        );
    }
    
    // ==============================
    // 物品属性方法
    // ==============================

    /**
     * 激活红石信号
     * <p>
     * 在指定位置激活红石信号
     * </p>
     *
     * @param level 当前世界
     * @param pos   方块位置
     * @param state 方块状态
     * @return 是否成功激活
     */
    @Override
    public boolean activateRedstoneSignal(Level level, BlockPos pos, BlockState state) {
        // 检查是否为客户端，只在服务端执行实际逻辑
        if (level.isClientSide) {
            return true; // 客户端总是返回成功
        }
        
        // 通知方块自身状态更新
        level.blockUpdated(pos, state.getBlock());
        // 更新周围方块的红石信号
        level.updateNeighborsAt(pos, state.getBlock());
        // 更新周围所有方向的方块，确保最大程度兼容各种方块
        for (Direction direction : Direction.values()) {
            BlockPos neighborPos = pos.relative(direction);
            BlockState neighborState = level.getBlockState(neighborPos);
            neighborState.neighborChanged(level, neighborPos, state.getBlock(), pos, false);
        }
        return true;
    }
    
    /**
     * 激活红石信号（带上下文）
     * <p>
     * 在指定位置激活红石信号
     * </p>
     *
     * @param context 使用上下文
     * @return 交互结果
     */
    public InteractionResult activateRedstoneSignal(UseOnContext context) {
        boolean activated = activateRedstoneSignal(
                context.getLevel(),
                context.getClickedPos(),
                context.getLevel().getBlockState(context.getClickedPos())
        );
        
        return activated ? InteractionResult.SUCCESS : InteractionResult.PASS;
    }
    
    /**
     * 获取红石信号强度
     * <p>
     * 获取该模块能提供的红石信号强度 (0-15)
     * </p>
     *
     * @return 红石信号强度
     */
    @Override
    public int getRedstoneSignalStrength() {
        return 15; // 提供最大强度的红石信号
    }

    /**
     * 获取物品显示名称
     * <p>
     * 返回该模块物品的显示名称。
     * </p>
     *
     * @param stack 物品栈
     * @return 显示名称
     */
    @Override
    public @NotNull Component getName(@NotNull ItemStack stack) {
        return Component.translatable("item.timetale_re.redstone_module");
    }
    
    /**
     * 获取模块的唯一标识符
     *
     * @return 模块ID
     */
    @Override
    public String getModuleId() {
        return "redstone_module";
    }
    
    /**
     * 获取模块的显示名称
     *
     * @return 模块名称
     */
    @Override
    public Component getDisplayName() {
        return Component.translatable("item.timetale_re.redstone_module");
    }
    
    /**
     * 获取模块类型
     *
     * @return 模块类型
     */
    @Override
    public ModuleType getModuleType() {
        return ModuleType.REDSTONE;
    }
    
    /**
     * 获取模块分类
     *
     * @return 模块分类
     */
    @Override
    public ModuleCategory getModuleCategory() {
        return ModuleCategory.FUNCTION;
    }

    @Override
    public ScrewdriverModuleItem.ModuleLevel getModuleLevel() {
        return ScrewdriverModuleItem.ModuleLevel.ADVANCED;
    }
}